Radiant less dimension mapping, clustering
mapping from distance between 2 items
Multidimensional Scaling: MDS

collaborative filtering recommendation model
prepare dataset for collaborative filtering
dataset has each user's rating for item
train data has complete rating for all items in each user
test data does not have rating for some item in each user
collaborative filtering caluculate a user's unknown ratings from the user's known rating for other items
tb0=attitude
names(tb0)=c('a0','a1','a2','a3','a4','a5','a6')
tb0$a4[26:30]=NA
tb0$a5[26:30]=NA
tb0$a6[26:30]=NA
tb0$train=c(rep(1,25),rep(0,5))
tb0=cbind(user=paste0('u',1:30),tb0)
tb=as_tibble(tb0)
tb=pivot_longer(tb, cols = c(-user,-train),
names_to = 'item', values_to = 'rating')

LS0tCnBhZ2V0aXRsZTogTm90ZWJvb2sgcmVwb3J0Cm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgaGlnaGxpZ2h0OiB6ZW5idXJuCiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKLS0tCgpgYGB7ciByX3NldHVwLCBpbmNsdWRlID0gRkFMU0V9CiMjIGluaXRpYWwgc2V0dGluZ3MKa25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGNvbW1lbnQgPSBOQSwKICBlY2hvID0gVFJVRSwKICBlcnJvciA9IFRSVUUsCiAgY2FjaGUgPSBGQUxTRSwKICBtZXNzYWdlID0gRkFMU0UsCgogIGRwaSA9IDk2LAogIHdhcm5pbmcgPSBGQUxTRQopCgojIyB3aWR0aCB0byB1c2Ugd2hlbiBwcmludGluZyB0YWJsZXMgZXRjLgpvcHRpb25zKAogIHdpZHRoID0gMjUwLAogIHNjaXBlbiA9IDEwMCwKICBtYXgucHJpbnQgPSA1MDAwLAogIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRQopCgojIyBtYWtlIGFsbCByZXF1aXJlZCBsaWJyYXJpZXMgYXZhaWxhYmxlIGJ5IGxvYWRpbmcgcmFkaWFudCBwYWNrYWdlIGlmIG5lZWRlZAppZiAoaXMubnVsbChzaGlueTo6Z2V0RGVmYXVsdFJlYWN0aXZlRG9tYWluKCkpKSBsaWJyYXJ5KHJhZGlhbnQpCgojIyBpbmNsdWRlIGNvZGUgdG8gbG9hZCB0aGUgZGF0YSB5b3UgcmVxdWlyZQojIyBmb3IgaW50ZXJhY3RpdmUgdXNlIGF0dGFjaCB0aGUgcl9kYXRhIGVudmlyb25tZW50CiMgYXR0YWNoKHJfZGF0YSkKYGBgCgo8c3R5bGU+Ci5idG4sIC5mb3JtLWNvbnRyb2wsIHByZSwgY29kZSwgcHJlIGNvZGUgewogIGJvcmRlci1yYWRpdXM6IDRweDsKfQoudGFibGUgewogIHdpZHRoOiBhdXRvOwp9CnVsLCBvbCB7CiAgcGFkZGluZy1sZWZ0OiAxOHB4Owp9CmNvZGUsIHByZSwgcHJlIGNvZGUgewogIG92ZXJmbG93OiBhdXRvOwogIHdoaXRlLXNwYWNlOiBwcmU7CiAgd29yZC13cmFwOiBub3JtYWw7Cn0KY29kZSB7CiAgY29sb3I6ICNjNzI1NGU7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjJmNDsKfQpwcmUgewogIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Cn0KPC9zdHlsZT4KCiMjIFJhZGlhbnQgbGVzcyBkaW1lbnNpb24gbWFwcGluZywgY2x1c3RlcmluZyAKCiMjIyBhcHBsaWNhYmlsaXR5IGZhY3RvciBhbmFseXNpcwpmaW5kaW5nIGhvdyBtYW55IGZhY3RvcnMgdG8gZXhwbGFpbiBlbm91Z2ggZnJvbSBlaWdlbiB2YWx1ZXMgY3VtdWxhdGl2ZQoKIVtdKHByZS1mYWN0b3Itc3VtbWFyeS1zY3JlZW5zaG90MS5wbmcpCiFbXShwcmUtZmFjdG9yLXBsb3Qtc2NyZWVuc2hvdDEucG5nKQohW10ocHJlLWZhY3Rvci1zdW1tYXJ5LXNjcmVlbnNob3QyLnBuZykKIVtdKHByZS1mYWN0b3ItcGxvdC1zY3JlZW5zaG90Mi5wbmcpCgoKIyMjIGZhY3RvciBhbmFseXNpcwoKIyMjIyBwcmluY2lwYWwgY29tcG9uZW50IGFuYWx5c2lzIChmYWN0b3IgYW5hbHlzaXMgd2l0aG91dCByb3RhdGlvbikKCiFbXShmYWN0b3Itc3VtbWFyeS1zY3JlZW5zaG90MS5wbmcpCiFbXShkYXRhLW1hbmFnZS1zY3JlZW5zaG90QjEucG5nKQohW10oZmFjdG9yLXBsb3Qtc2NyZWVuc2hvdDEucG5nKQohW10oZmFjdG9yLXBsb3Qtc2NyZWVuc2hvdDIucG5nKQoKIVtdKGZhY3Rvci1zdW1tYXJ5LXNjcmVlbnNob3QyLnBuZykKIVtdKGRhdGEtbWFuYWdlLXNjcmVlbnNob3RCMi5wbmcpCiFbXShmYWN0b3ItcGxvdC1zY3JlZW5zaG90My5wbmcpCiFbXShmYWN0b3ItcGxvdC1zY3JlZW5zaG90NC5wbmcpCgohW10oZmFjdG9yLXN1bW1hcnktc2NyZWVuc2hvdDMucG5nKQohW10oZmFjdG9yLXBsb3Qtc2NyZWVuc2hvdDUucG5nKQohW10oZmFjdG9yLXBsb3Qtc2NyZWVuc2hvdDYucG5nKQoKIyMjIyBmYWN0b3IgYW5hbHlzaXMgd2l0aCB2YXJpbWF4IHJvdGF0aW9uCgohW10oZmFjdG9yLXN1bW1hcnktc2NyZWVuc2hvdDQucG5nKQohW10oZmFjdG9yLXBsb3Qtc2NyZWVuc2hvdDcucG5nKQohW10oZmFjdG9yLXBsb3Qtc2NyZWVuc2hvdDgucG5nKQoKIVtdKGZhY3Rvci1zdW1tYXJ5LXNjcmVlbnNob3Q1LnBuZykKIVtdKGZhY3Rvci1wbG90LXNjcmVlbnNob3Q5LnBuZykKCgoKIyMjIG1hcHBpbmcgZnJvbSBkaXN0YW5jZSBiZXR3ZWVuIDIgaXRlbXMKTXVsdGlkaW1lbnNpb25hbCBTY2FsaW5nOiBNRFMKCiFbXShkYXRhLW1hbmFnZS1zY3JlZW5zaG90QjMucG5nKQohW10oZGlzc2ltaWxhcml0eS1zdW1tYXJ5LXNjcmVlbnNob3QxLnBuZykKIVtdKGRpc3NpbWlsYXJpdHktcGxvdC1zY3JlZW5zaG90MS5wbmcpCgoKIyMjIG1hcHBpbmcgZnJvbSBpdGVtJ3MgYXR0cmlidXRlcyB2ZWN0b3IKCiFbXShkYXRhLW1hbmFnZS1zY3JlZW5zaG90QjQucG5nKQohW10oYXR0cmlidXRlcy1zdW1tYXJ5LXNjcmVlbnNob3QxLnBuZykKIVtdKGRhdGEtbWFuYWdlLXNjcmVlbnNob3RCNS5wbmcpCiFbXShhdHRyaWJ1dGVzLXBsb3Qtc2NyZWVuc2hvdDEucG5nKQoKCgojIyMgaGllcmFyY2hpY2FsIGNsdXN0ZXJpbmcgCgohW10oZGF0YS1tYW5hZ2Utc2NyZWVuc2hvdEI2LnBuZykKIVtdKGhpZXJhcmNoaWNhbC1zY3JlZW5zaG90MS5wbmcpCiFbXShkYXRhLW1hbmFnZS1zY3JlZW5zaG90QjcucG5nKQoKCiMjIyBLLW1lYW5zIGNsdXN0ZXJpbmcgCgohW10oay1jbHVzdGVyaW5nLXN1bW1hcnktc2NyZWVuc2hvdDEucG5nKQohW10oZGF0YS1tYW5hZ2Utc2NyZWVuc2hvdEI4LnBuZykKIVtdKGstY2x1c3RlcmluZy1wbG90LXNjcmVlbnNob3QxLnBuZykKCgoKIyMjIHF1YXRpdGF0aXZlIHZhcmlhYmxlIGV4cGxhaW5lZCBieSBtdWx0aSBvcmRuaW5hbCB2YXJpYWJsZSAKY29uam9pb250IGFuYWx5c2lzCgohW10oZGF0YS1tYW5hZ2Utc2NyZWVuc2hvdEI5LnBuZykKIVtdKGNvbmpvaW50LXN1bW1hcnktc2NyZWVuc2hvdDEucG5nKQohW10oY29uam9pbnQtcHJlZGljdC1zY3JlZW5zaG90MS5wbmcpCiFbXShkYXRhLW1hbmFnZS1zY3JlZW5zaG90QzEucG5nKQohW10oY29uam9pbnQtcGxvdC1zY3JlZW5zaG90MS5wbmcpCgoKCiMjIyBjb2xsYWJvcmF0aXZlIGZpbHRlcmluZyByZWNvbW1lbmRhdGlvbiBtb2RlbAoKPHByZT4KcHJlcGFyZSBkYXRhc2V0IGZvciBjb2xsYWJvcmF0aXZlIGZpbHRlcmluZwpkYXRhc2V0IGhhcyBlYWNoIHVzZXIncyByYXRpbmcgZm9yIGl0ZW0KdHJhaW4gZGF0YSBoYXMgY29tcGxldGUgcmF0aW5nIGZvciBhbGwgaXRlbXMgaW4gZWFjaCB1c2VyCnRlc3QgZGF0YSBkb2VzIG5vdCBoYXZlIHJhdGluZyBmb3Igc29tZSBpdGVtIGluIGVhY2ggdXNlcgoKY29sbGFib3JhdGl2ZSBmaWx0ZXJpbmcgY2FsdWN1bGF0ZSBhIHVzZXIncyB1bmtub3duIHJhdGluZ3MgZnJvbSB0aGUgdXNlcidzIGtub3duIHJhdGluZyBmb3Igb3RoZXIgaXRlbXMKPC9wcmU+CgpgYGAKdGIwPWF0dGl0dWRlCm5hbWVzKHRiMCk9YygnYTAnLCdhMScsJ2EyJywnYTMnLCdhNCcsJ2E1JywnYTYnKQp0YjAkYTRbMjY6MzBdPU5BCnRiMCRhNVsyNjozMF09TkEKdGIwJGE2WzI2OjMwXT1OQQp0YjAkdHJhaW49YyhyZXAoMSwyNSkscmVwKDAsNSkpCnRiMD1jYmluZCh1c2VyPXBhc3RlMCgndScsMTozMCksdGIwKQp0Yj1hc190aWJibGUodGIwKQp0Yj1waXZvdF9sb25nZXIodGIsIGNvbHMgPSBjKC11c2VyLC10cmFpbiksCiAgICAgICAgICAgICAgICBuYW1lc190byA9ICdpdGVtJywgdmFsdWVzX3RvID0gJ3JhdGluZycpCmBgYAoKIVtdKGRhdGEtbWFuYWdlLXNjcmVlbnNob3RDMi5wbmcpCiFbXShkYXRhLXZpZXctc2NyZWVuc2hvdDIucG5nKQohW10oY29sbGFib3JhdGl2ZS1maWx0ZXJpbmctc3VtbWFyeS1zY3JlZW5zaG90MS5wbmcpCiFbXShjb2xsYWJvcmF0aXZlLWZpbHRlcmluZy1zdW1tYXJ5LXNjcmVlbnNob3QyLnBuZykKIVtdKGRhdGEtbWFuYWdlLXNjcmVlbnNob3RDMy5wbmcpCgo=